package cn.wolfcode.shop.listener;

import cn.wolfcode.shop.redis.RedisServer;
import cn.wolfcode.shop.redis.SeckillGoodKeyPrefix;
import cn.wolfcode.shop.service.ISeckillGoodService;
import cn.wolfcode.shop.vo.GoodVo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationListener;
import org.springframework.context.event.ContextRefreshedEvent;
import org.springframework.stereotype.Component;

import java.util.List;

/**
 * 同于缓存热点数据 在服务器启动时,将可能被大量访问的数据 缓存到redis中
 */
@Component
public class InitListener implements ApplicationListener<ContextRefreshedEvent> {
    @Autowired
    private RedisServer redisServer;
    @Autowired
    private ISeckillGoodService seckillGoodService;

    @Override
    public void onApplicationEvent(ContextRefreshedEvent event) {
        //由于秒杀活动开始后,随时都可能有大量请求访问数据库,造成数据库压力过大
        //解决思路:避免大量请求连接数据库
        //使用缓存,在服务一启动,先将此次活动的热点数据提前放入缓存中,活动一开始,直接从缓存中拿数据,避免了请求数据库
        //问题:在提供服务的服务器上使用监听器,若服务器集群,则重复执行,作出多余的操作
        //解决:使用一台不提供客户服务,压力晓得的单机部署服务器,在此服务器启动时做素有的初始化工作,读数据库热点数据进缓存
        List<GoodVo> goodVos = seckillGoodService.selectAll();
        for (GoodVo goodVo : goodVos) {
            //将所有秒杀活动商品放hash中,key代表是秒杀商品,field为商品的id,value为商品对象
            redisServer.hset(SeckillGoodKeyPrefix.SECKILL_GOOD_HASH, "",goodVo.getGoodId()+"", goodVo);
            redisServer.set(SeckillGoodKeyPrefix.SECKILL_GOOD_STOCK,goodVo.getGoodId()+"",goodVo.getStockCount());
        }
        //活动服务启动时,将活动库存放入redis中

    }
}
